package com.sky.task;

import cn.hutool.core.collection.CollectionUtil;
import com.sky.entity.Orders;
import com.sky.mapper.OrdersMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Component//定时任务,清理订单状态
@Slf4j
public class OrderTask {

    @Autowired
    private OrdersMapper ordersMapper;

    //检查超时未支付的订单(每隔1分钟检查一下，是否有订单处于待支付状态超过15分钟，如果有修改为取消状态)
    @Scheduled(cron = "0 0/1 * * * ?")
    public void processTimeOutOrder() {
        log.info("开始清理超时未支付订单....");
        //1. 查询超时15分钟订单
        //select * from order where status = 未支付 and order_time < 现在-15
        LocalDateTime time = LocalDateTime.now().minusMinutes(15);//当前时间的减去15分钟(JDK8以后)
        List<Orders> ordersList = ordersMapper.findByStatusAndOrderTime(Orders.PENDING_PAYMENT, time);//PENDING_PAYMENT = 1待付款
        //2. 遍历所有超过15分钟以上的订单
        if (CollectionUtil.isNotEmpty(ordersList)) {
            //2-1 将订单状态改为已取消
            ordersList.forEach(orders -> {
                orders.setStatus(Orders.CANCELLED);//CANCELLED=6已取消
                orders.setCancelTime(LocalDateTime.now());//取消时间
                orders.setCancelReason("超时未支付");//取消原因
                ordersMapper.update(orders);
            });
        }
        log.info("结束清理超时未支付订单....");
    }

    //检查超时未完成的订单(每天凌晨1点检查一下，前面一天生成的订单是否有处于派送中的，如果有修改为已完成状态)
    @Scheduled(cron = "0 0 1 * * ?")
    public void processTimeOutDelivery() {
        log.info("开始清理超时未完成的订单....");
        //1. 查询超时15分钟订单
        //select * from order where status = 派送中 and order_time < 现在-15
        LocalDateTime time = LocalDateTime.now().minusDays(1);//当前时间的减去15分钟(JDK8以后)
        List<Orders> ordersList = ordersMapper.findByStatusAndOrderTime(Orders.DELIVERY_IN_PROGRESS, time);//DELIVERY_IN_PROGRESS = 4派送中
        //2. 遍历所有超过15分钟以上的订单
        if (CollectionUtil.isNotEmpty(ordersList)) {
            //2-1 将订单状态改为已取消
            ordersList.forEach(orders -> {
                orders.setStatus(Orders.COMPLETED);//COMPLETED=5已完成
                orders.setCheckoutTime(LocalDateTime.now());//取消时间
                ordersMapper.update(orders);
            });
        }
        log.info("结束清理超时未完成的订单....");
    }


}


